package com.spzx.product.api;

import com.spzx.common.core.constant.SecurityConstants;
import com.spzx.common.core.constant.ServiceNameConstants;
import com.spzx.common.core.domain.R;
import com.spzx.common.core.web.page.TableDataInfo;
import com.spzx.product.domain.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.SpringQueryMap;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

//当前feign客户端的作用是 访问 spzx-product服务的接口  得到返回的结果
//java项目需要访问另一个项目，需要发起网络请求才可以(HttpClient、Socket、RestTemplate、OpenFeign)
// restful风格： http协议+json   channel‘服务访问product服务时，需要封装http协议的请求报文+准备请求数据 + 解析product的响应报文(体)
@FeignClient(contextId = "remoteProductService",
        value = ServiceNameConstants.PRODUCT_SERVICE,
        fallbackFactory = RemoteProductFallbackFactory.class)
//降级工厂:保证远程调用失败时，可以返回默认/兜底数据
//1、value = ServiceNameConstants.PRODUCT_SERVICE(可以从注册中心获取到服务的ip+端口号) 等于 调用RemoteProductService时 想要访问的目标服务 ip+端口

//FeignClient的目的是为了将 远程访问的 报文封装进行简化、响应报文的解析进行简化
public interface RemoteProductService {
    //2、 @GetMapping("/product/getTopSale") 相应于 请求方式+ 资源路径    http://localhost:9205/product/getTopSale + get请求方式
    @GetMapping("/product/getTopSale")
    public R<List<ProductSku>> getTopSale(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);//表示配置请求头参数

    //3、 R<TableDataInfo> 表示将接收到的响应体内容转换的类型
    @GetMapping("/product/skuList/{pageNum}/{pageSize}")
    public R<TableDataInfo> skuList(@PathVariable("pageNum") Integer pageNum, @PathVariable("pageSize") Integer pageSize, @SpringQueryMap SkuQuery skuQuery, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

}
